import 'package:dio/dio.dart';
import 'package:enjoy_plus/utils/http.dart';
import 'package:enjoy_plus/utils/toast.dart';
import 'package:enjoy_plus/utils/validate.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:image_picker/image_picker.dart';
import 'dart:typed_data';
import 'package:flutter/foundation.dart' show kIsWeb;
import 'package:http_parser/http_parser.dart';

class HouseForm extends StatefulWidget {
  const HouseForm({super.key, required this.params});

  final Map params;

  @override
  State<HouseForm> createState() => _HouseFormState();
}

class _HouseFormState extends State<HouseForm> {
  final Map _formData = {
    'point': '', // 小区信息
    'building': '', // 小区楼栋信息
    'room': '', // 小区房间信息
    'name': '', // 业主姓名
    'gender': 1, // 业主性别0女1男
    'mobile': '', // 业主电话
    'idcardFrontUrl': '', // 身份证正面
    'idcardBackUrl': '', // 身份证背面
  };

 @override
  void initState() {
    super.initState();
    // _formData.addAll(widget.params);
    // print(widget.params);
    _formData['point'] = widget.params['point'];
    _formData['building'] = widget.params['building'];
    _formData['room'] = widget.params['room'];


    setState(() {
      _formData.addAll(widget.params);
      _nameController.text = _formData['name'];
      _mobileController.text = _formData['mobile'];
    });
  }


 // 定义控制器
  final TextEditingController _nameController = TextEditingController();
  final TextEditingController _mobileController = TextEditingController();

   /// 提交表单
  /// 提交表单
  _submitForm() async {
    // 1. 校验表单数据
    String name = _nameController.text;
    if (!Validate.validateName(name)) return;

    String mobile = _mobileController.text;
    if (!Validate.validatePhone(mobile)) return;

    if (!Validate.validateIdCardImg(
        _formData['idcardFrontUrl'], _formData['idcardBackUrl'])) return;

    _formData['name'] = name;
    _formData['mobile'] = mobile;
  if (_formData.containsKey('id')) {
    _formData.remove('status');
  } 
    try {
      // 调用接口
      var res = await http.post('/room', _formData);
      // 检测接口调用的结果
      // if (res['code'] != 10000) return ToastUtil.showError('添加房屋失败!');
      // ToastUtil.showSuccess('添加房屋成功');

// 检测接口调用的结果
    String tag = _formData.containsKey('id') ? '修改' : '添加';
    if (res['code'] != 10000) return ToastUtil.showError('$tag房屋失败!');
    ToastUtil.showSuccess('$tag房屋成功');


      Navigator.popUntil(context, (route) {
        print(route.settings.name);
        return route.settings.name == '/';
      });
    } catch (e) {
      ToastUtil.showError('网络请求出现问题!');
    }
  }

  Widget _buildAddIdcardPhoto(String tag, String info) {
    return GestureDetector(
     onTap:(){
      showBottomSheet(tag);
     },
     child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      crossAxisAlignment: CrossAxisAlignment.center,
      children: [
        Icon(
          Icons.add,
          size: 30,
          color: Color.fromARGB(255, 85, 145, 175),
        ),
        Text(
          info, // 使用传入的info参数，而不是硬编码的文本
          style: TextStyle(
            color: Color.fromARGB(255, 85, 145, 175),
          ),
        ),
      ]),
    );
  }

/// 上传图片
  void showBottomSheet(String tag) {
    showModalBottomSheet(
        context: context,
        builder: (context) {
          return Container(
              padding: const EdgeInsets.all(10),
              height: 180,
              child: Column(
                children: [
                  ListTile(
                      leading: const Icon(Icons.camera_alt),
                      title: const Text('拍照'),
                      trailing: const Icon(Icons.arrow_forward_ios_rounded),
                      onTap: () async {
                        // 调用相机
                        ImagePicker picker = ImagePicker();
                        final XFile? photo =
                            await picker.pickImage(source: ImageSource.camera);
                        if (photo != null) {
                          uploadAvatar(tag, photo.path);
                        }
                      }),
                  ListTile(
                      leading: const Icon(Icons.image),
                      title: const Text('相册'),
                      trailing: const Icon(Icons.arrow_forward_ios_rounded),
                      onTap: () async {
                        // 调用相册
                        ImagePicker picker = ImagePicker();
                        final XFile? image =
                            await picker.pickImage(source: ImageSource.gallery);
                        if (image != null) {
                          print(image.path);
                          uploadAvatar(tag, image.path);
                        }
                      })
                ],
              ));
        });
  }

  /// 上传图片
  uploadAvatar(String tag, String imagePath) async {
    try {
      print('准备上传图片: $imagePath');
      
      FormData fd;
      
      // 针对Web平台的特殊处理
      if (kIsWeb) {
        // 对于Web平台，我们需要使用不同的方法
        // 从XFile获取字节数据
        final picker = ImagePicker();
        final XFile pickedFile = XFile(imagePath);
        final Uint8List bytes = await pickedFile.readAsBytes();
        
        // 生成一个有效的文件名，使用时间戳确保唯一性
        final timestamp = DateTime.now().millisecondsSinceEpoch;
        String extension = "jpg"; // 默认扩展名
        
        // 尝试从路径中提取扩展名
        if (imagePath.contains('.')) {
          final pathExtension = imagePath.split('.').last.toLowerCase();
          if (pathExtension == 'png' || pathExtension == 'jpg' || pathExtension == 'jpeg') {
            extension = pathExtension;
          }
        }
        
        final fileName = 'image_$timestamp.$extension';
        
        // 确定MIME类型
        String mimeType = extension == 'png' ? 'image/png' : 'image/jpeg';
        
        // 创建适用于Web的FormData
        fd = FormData.fromMap({
          "file": MultipartFile.fromBytes(
            bytes,
            filename: fileName,
            contentType: MediaType.parse(mimeType),
          ),
        });
        
        print('Web平台上传，文件名: $fileName, MIME类型: $mimeType');
      } else {
        // 非Web平台使用原来的方法，但需要修改文件名
        final timestamp = DateTime.now().millisecondsSinceEpoch;
        String extension = "jpg"; // 默认扩展名
        
        // 尝试从路径中提取扩展名
        if (imagePath.contains('.')) {
          final pathExtension = imagePath.split('.').last.toLowerCase();
          if (pathExtension == 'png' || pathExtension == 'jpg' || pathExtension == 'jpeg') {
            extension = pathExtension;
          }
        }
        
        final fileName = 'image_$timestamp.$extension';
        
        fd = FormData.fromMap({
          "file": await MultipartFile.fromFile(
            imagePath,
            filename: fileName,
          )
        });
        
        print('非Web平台上传，文件名: $fileName');
      }
      
      print('FormData创建成功，准备发送请求');
      
      // 调用上传接口
      var res = await http.post('/upload', fd);
      print('上传接口响应: $res');
      
      if (res['code'] != 10000) {
        print('上传失败，错误码: ${res['code']}, 错误信息: ${res['message']}');
        return ToastUtil.showError('上传图片失败: ${res['message'] ?? "未知错误"}');
      }
      
      setState(() {
        _formData[tag] = res['data']['url'];
        ToastUtil.showSuccess('上传图片成功');
      });
    } catch (e) {
      print('上传图片异常: $e');
      ToastUtil.showError('上传图片失败: $e');
    } finally {
      Navigator.pop(context);
    }
  }

  Widget _buildIdcardPhoto(String tag, String photoUrl) {
    return Stack(children: [
      SizedBox(
        width: MediaQuery.of(context).size.width - 20,
        height: 300,
        child: photoUrl.startsWith('http') 
            ? Image.network(photoUrl, fit: BoxFit.contain)
            : Image.asset(photoUrl, fit: BoxFit.contain),
      ),
      Positioned(
        right: 0,
        top: 0,
        child: GestureDetector(
          child: const Icon(Icons.delete, color: Colors.red),
          onTap: () {
            setState(() {
              _formData[tag] = '';
            });
          },
        ),
      )
    ]);
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title:  Text('${_formData.containsKey('id')? '修改房屋信息' : '添加房屋信息'}'),
        backgroundColor: Colors.transparent,
        centerTitle: true,
      ),
      body: ListView(
        padding: const EdgeInsets.only(top: 10, bottom: 10),
        children: [
          // 房屋信息
          Container(
            padding: const EdgeInsets.all(10),
            child: const Text(
              '房屋信息',
              style: TextStyle(
                  color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
            ),
          ),
          Container(
            color: Colors.white,
            padding:
                const EdgeInsets.only(left: 10, right: 10, top: 15, bottom: 15),
            child:  Text(
              _formData['point'] +
                  _formData['building'] +
                  _formData['room'] +
                  '室',
            ),
          ),
          // 业主信息
          Container(
            padding: const EdgeInsets.all(10),
            child: const Text(
              '业主信息',
              style: TextStyle(
                  color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
            ),
          ),
          // 业主姓名
          Container(
            color: Colors.white,
            padding: const EdgeInsets.only(left: 10, right: 10),
            child: TextField(
              maxLength: 15,
              controller: _nameController,
              decoration: const InputDecoration(
                labelText: '姓名',
                hintText: '请输入业主姓名',
                hintStyle: TextStyle(color: Colors.grey),
                border: InputBorder.none,
              ),
              inputFormatters: [
                LengthLimitingTextInputFormatter(10),
              ],
            ),
          ),
          // 性别
          Container(
            color: Colors.white,
            padding: const EdgeInsets.only(left: 10, right: 10),
            child: Row(
              children: [
                const Text(
                  '性别',
                  style: TextStyle(fontSize: 16),
                ),
                const SizedBox(width: 20),
                Radio(
                  value: 1,
                  groupValue: _formData['gender'],
                  onChanged: (value) {
                    setState(() {
                      _formData['gender'] = value ?? '';
                    });
                  },
                ),
                const Text('男'),
                const SizedBox(width: 10),
                Radio(
                  value: 0,
                  groupValue: _formData['gender'],
                  onChanged: (value) {
                    setState(() {
                      _formData['gender'] = value ?? '';
                    });
                  },
                ),
                const Text('女'),
              ],
            ),
          ),
          // 业主手机号
          Container(
            color: Colors.white,
            padding: const EdgeInsets.only(left: 10, right: 10),
            child: TextField(
              controller: _mobileController,
              keyboardType: TextInputType.phone,
              maxLength: 11,
              decoration: const InputDecoration(
                labelText: '手机号',
                hintText: '请输入您的手机号',
                hintStyle: TextStyle(color: Colors.grey),
                border: InputBorder.none,
              ),
              inputFormatters: [
                LengthLimitingTextInputFormatter(11),
              ],
            ),
          ),
          // 业主信息
          Container(
            padding: const EdgeInsets.all(10),
            child: const Text(
              '本人身份证照片',
              style: TextStyle(
                  color: Color.fromARGB(255, 97, 94, 94), fontSize: 16),
            ),
          ),
          Container(
            padding: const EdgeInsets.only(left: 10, right: 10, bottom: 10),
            child: const Text(
              '请拍摄证件原件，并使照片中证件边缘完整，文字清晰，光线均匀。',
              style: TextStyle(
                  color: Color.fromARGB(255, 97, 94, 94), fontSize: 12),
            ),
          ),
          // 身份证正面
          Container(
            color: Colors.white,
            height: 320,
            padding: const EdgeInsets.all(10),
            child: _formData['idcardFrontUrl'] == ''
                ? _buildAddIdcardPhoto('idcardFrontUrl', '上传人像面照片')
                : _buildIdcardPhoto(
                    'idcardFrontUrl',
                    _formData['idcardFrontUrl'],
                  ),
          ),
          const SizedBox(height: 20),
          // 身份证反面
          Container(
            color: Colors.white,
            height: 320,
            padding: const EdgeInsets.all(10),
            child: _formData['idcardBackUrl'] == ''
                ? _buildAddIdcardPhoto('idcardBackUrl', '上传国徽面照片')
                : _buildIdcardPhoto(
                    'idcardBackUrl',
                    _formData['idcardBackUrl'],
                  ),
          ),
          const SizedBox(height: 20),
          // 提交审核
          Container(
            padding: const EdgeInsets.all(10),
            child: ElevatedButton(
              onPressed: () {
                // : 提交审核
                _submitForm();
              },
              child: const Column(
                children: [
                  SizedBox(height: 8),
                  Icon(Icons.exit_to_app),
                  Text('提交审核'),
                  SizedBox(height: 8)
                ],
              ),
            ),
          ),
        ],
      ),
    );
  }
}
